#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <assert.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>

// #include "inc/gsf.h"
// #include "zoom_lens.h"
// #include "msg_func.h"
// #include "cfg.h"

// #include "mod/bsp/inc/bsp.h"
// #include "mod/zoom-lens/inc/zoom_lens.h"
#include "spi_ms41929.h"
// #include "gpio.h"
// GSF_LOG_GLOBAL_INIT("ZOOM-LENS", 8*1024);

// static int reg2bsp()
// {
//    printf("reg2bsp begin\n");
//    while(1)
//   {
//     //register To;
//     GSF_MSG_DEF(gsf_mod_reg_t, reg, 8*1024);
//     reg->mid = GSF_MOD_ID_ZOOM_LENS;
//     strcpy(reg->uri, GSF_IPC_ZOOM_LENS);
//     int ret = GSF_MSG_SENDTO(GSF_ID_MOD_CLI, 0, SET, GSF_CLI_REGISTER, sizeof(gsf_mod_reg_t), GSF_IPC_BSP, 2000);
//     printf("GSF_CLI_REGISTER To:%s, ret:%d, size:%d\n", GSF_IPC_BSP, ret, __rsize);

//     static int cnt = 3;
//     if(ret == 0)
//       break;
//     if(cnt-- < 0)
//       return -1;
//     sleep(1);
//   }
//   return 0;
// }

// // mod msg;
// static int req_recv(char *in, int isize, char *out, int *osize, int err)
// {
//     int ret = 0;
//     gsf_msg_t *req = (gsf_msg_t*)in;
//     gsf_msg_t *rsp = (gsf_msg_t*)out;

//     *rsp  = *req;
//     rsp->err  = 0;
//     rsp->size = 0;

//     ret = msg_func_proc(req, isize, rsp, osize);

//     rsp->err = (ret == TRUE)?rsp->err:GSF_ERR_MSG;
//     *osize = sizeof(gsf_msg_t)+rsp->size;
//     printf("req->id:%d, set:%d, rsp->err:%d, size:%d\n", req->id, req->set, rsp->err, rsp->size);
//     return 0;
// }

int gsf_lens_zoom(int ch, int dir, int speed)
{
    printf("zoom,ch:%d,dir:%d,speed:%d\n", ch, dir, speed);
    if (dir == 0)
    {
        spi_ms41929_write(0x24, 0x045f);
    }
    else
    {
        spi_ms41929_write(0x24, 0x055f);
    }
    spi_ms41929_write(0x25, 0x05ff * speed);

    pwm0_enable();

    return 1;
}

int gsf_lens_focus(int ch, int dir, int speed)
{
    printf("focus,ch:%d,dir:%d,speed:%d\n", ch, dir, speed);
    if (dir == 0)
    {
        spi_ms41929_write(0x29, 0x045f);
    }
    else
    {
        spi_ms41929_write(0x29, 0x055f);
    }
    spi_ms41929_write(0x2a, 0x05ff * speed);

    pwm0_enable();

    return 1;
}

int gsf_lens_stop(int ch)
{
    pwm0_disable();
};
int main(int argc, char *argv[])
{
    // init listen;
    zoom_lens_init();
    // gsf_lens_zoom(0,1,5);
    // gsf_lens_focus(0,1,2);
    gsf_lens_stop(0);
    // GSF_LOG_CONN(1, 100);
    //   reg2bsp();
    //  void* rep = nm_rep_listen(GSF_IPC_ZOOM_LENS
    //                    , NM_REP_MAX_WORKERS
    //                    , NM_REP_OSIZE_MAX
    //                    , req_recv);

    while (1)
    {

        spi_ms41929_write(0x29, 0x045f);
        spi_ms41929_write(0x24, 0x055f);
        spi_ms41929_write(0x2a, 0x400);
        //spi_ms41929_write(0x25, 0x0e50); // the less,the faster
        //pwm0_enable();
        usleep(10);
    }

    // GSF_LOG_DISCONN();

    //  spi_ms41929_VDFZ_pulse();

    // while (1)
    // {            sleep(1);
    //    spi_ms41929_VDFZ_pulse();

    // }

    return 0;
}
